#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct carro{
    int id;
    char modelo[20];
    char marca[20];
    char ano[10]; //Ano é do tipo string pois tem carro que pode ser 2008/2009
    float valor;
    char tipo[20]; //tipo define se o automóvel é novo, semi-novo ou usado.
}Auto;

typedef struct servico{
    int codigo;
    char descricao[25];
    float valor;
}Servico;

void venda(); //definido como void por hora.
void cadastro();
void editarCadastro();
void relatorio();
void busca();
void excluir();
void limpaTela();

int quantCadAut;
int quantCadSer;
Auto carro[100];
Servico serv[100];
char modeloBase[20];
char servicoBase[20];


int main()
{
    int opcao;

    do
    {
        limpaTela();

        printf("********************************************************************************\n");
        printf("*                 SEJA BEM-VINDO A CONCESSIONARIA NEW-AUTO                     *\n");
        printf("********************************************************************************\n");
        printf("*                          1 - VENDA                                           *\n");
        printf("*                          2 - CADASTRO                                        *\n");
        printf("*                          3 - RELATORIOS                                      *\n");
        printf("*                          4 - BUSCA                                           *\n");
        printf("*                          5 - EXCLUSAO                                        *\n");
        printf("*                          6 - SAIR                                            *\n");
        printf("********************************************************************************\n\n");

        scanf("%d", &opcao);

        switch(opcao)
        {
            case 1:
              venda();
              break;
            case 2:
              cadastro();
              break;
            case 3:
              relatorio();
              break;
            case 4:
              busca();
              break;
            case 5:
              excluir();
              break;
            case 6:
              printf("Programa finalizado.\n");
              break;
            default:
              printf("Opcao invalida.\n");
        }


    }while(opcao != 6);

    return(0);
}

void venda()
{
    int i, idBusca, opFinal,opcao4;
    double vendaTotal;

    do
    {
        printf("********************************************************************************\n");
        printf("*                            MENU DE RELATÓRIOS                                *\n");
        printf("********************************************************************************\n");
        printf("*                        1 - VENDA AUTOMOVEIS                                 *\n");
        printf("*                        2 - VENDA SERVICOS                                   *\n");
        printf("*                        3 - SAIR                                              *\n");
        printf("********************************************************************************\n\n");

        scanf("%d", &opcao4);

        switch(opcao4)
        {
            case 1:
                do
                {
                    do
                    {
                        limpaTela();

                        puts("Informe o ID do carro a ser vendido: \n");
                        scanf("%d", &idBusca);

                        if(carro[idBusca -1].id == 0)
                        {
                            puts("Nenhum carro cadastrado com ID informado, forneca um ID valido.\n");
                        }

                    }while(carro[idBusca -1].id == 0);

                    vendaTotal = vendaTotal + carro[idBusca - 1].valor;

                    printf("Venda total: %.2f \n\n", vendaTotal);

                    puts("Deseja finalisar a venda? Precione 0 para sim ou 1 para nao: \n");
                    scanf("%d", &opFinal);

                }while(opFinal != 0);
                break;
            case 2:
                do
                {
                    do
                    {
                        limpaTela();

                        puts("Informe o codigo da peca a ser vendida: \n");
                        scanf("%d", &idBusca);

                        if(servico[idBusca -1].codigo == 0)
                        {
                            puts("Nenhuma peca cadastrada com o codigo informado, forneca um codigo valido.\n");
                        }

                    }while(servico[idBusca -1].codigo == 0);

                    vendaTotal = vendaTotal + servico[idBusca - 1].valor;

                    printf("Venda total: %.2f \n\n", vendaTotal);

                    puts("Deseja finalisar a venda? Precione 0 para sim ou 1 para nao: \n");
                    scanf("%d", &opFinal);

                }while(opFinal != 0);

                break;

        }

    }while(opcao4 != 3);
}

void cadastro()
{
    int opcao2,i,quant1,indcadastrado1,indcadastrado2,quant2;

    do
    {
        limpaTela();

        printf("********************************************************************************\n");
        printf("*                            MENU DE CADASTRO                                  *\n");
        printf("********************************************************************************\n");
        printf("*                        1 - CADASTRAR AUTOMOVEL                               *\n");
        printf("*                        2 - CADASTRAR SERVICO                                 *\n");
        printf("*                        3 - SAIR                                              *\n");
        printf("********************************************************************************\n\n");

        scanf("%d", &opcao2);

        switch(opcao2)
        {
            case 1:
              limpaTela();
              printf("Informe a quantidade de cadastros a serem realizados: \n");
              scanf("%d", &quant1);

              indcadastrado1 = quantCadAut + quant1;

              for(i = quantCadAut;i < indcadastrado1;i++)
              {
                  limpaTela();

                  printf("Informe o modelo: \n");
                  __fpurge(stdin);
                  fgets(carro[i].modelo,19,stdin);
                  strtok(carro[i].modelo, "\n");

                  printf("Informe o ano: \n");
                  __fpurge(stdin);
                  fgets(carro[i].ano,9,stdin);
                  strtok(carro[i].ano, "\n");

                  printf("Informe a marca do carro: \n");
                  __fpurge(stdin);
                  fgets(carro[i].marca,19,stdin);
                  strtok(carro[i].marca, "\n");

                  printf("Informe o valor: \n");
                  __fpurge(stdin);
                  scanf("%f", &carro[i].valor);

                  printf("Informe o tipo: \n");
                  __fpurge(stdin);
                  fgets(carro[i].tipo,19,stdin);
                  strtok(carro[i].tipo, "\n");
                  printf("\n");

                  quantCadAut++;
                  carro[i].id = quantCadAut;
              }
              break;
            case 2:
              limpaTela();
              printf("Informe a quantidade de cadastros a serem realizados: \n");
              scanf("%d", &quant2);

              indcadastrado2 = quantCadSer + quant2;

              for(i =quantCadSer;i < indcadastrado2;i++)
              {
                  limpaTela();

                  printf("Informe a descricao do servico: \n");
                  __fpurge(stdin);
                  fgets(serv[i].descricao,24,stdin);
                  strtok(serv[i].descricao, "\n");

                  printf("Informe o valor: \n");
                  __fpurge(stdin);
                  scanf("%f", &serv[i].valor);

                  quantCadSer++;
                  serv[i].codigo = quantCadSer;

              }
            default:
              printf("opcao invalida.\n");

        }
    }while(opcao2 != 3);

}

void relatorio()
{
    int opcao3,i;

    limpaTela();

    do
    {

        printf("********************************************************************************\n");
        printf("*                            MENU DE RELATÓRIOS                                *\n");
        printf("********************************************************************************\n");
        printf("*                        1 - LISTAR AUTOMOVEIS                                 *\n");
        printf("*                        2 - LISTAR SERVICOS                                   *\n");
        printf("*                        3 - SAIR                                              *\n");
        printf("********************************************************************************\n\n");

        scanf("%d", &opcao3);

        switch(opcao3)
        {
            case 1:
              limpaTela();
              for(i =0;i < quantCadAut;i++)
              {
                  printf("ID: %d\n", carro[i].id);
                  printf("Modelo: %s\n", carro[i].modelo);
                  printf("Ano: %s\n", carro[i].ano);
                  printf("Marca: %s\n", carro[i].marca);
                  printf("Valor: %.2f \n", carro[i].valor);
                  printf("Tipo: %s\n",carro[i].tipo);
                  printf("\n");
              }
              /*puts("Tecle ENTER para voltar \n");
              getchar();*/
              break;
            case 2:
                limpaTela();
                for(i =0;i < quantCadSer;i++)
              {
                  printf("Codigo: %d\n", serv[i].codigo);
                  printf("Descricao: %s\n", serv[i].descricao);
                  printf("Valor: %.2f \n", serv[i].valor);
                  printf("\n");
              }
              /*puts("Tecle ENTER para voltar \n");
              getchar();*/
              break;
        }
      }while(opcao3 != 3);
}

void busca()
{
    int b,i;

    limpaTela();

    printf("Informe 1 para buscar automóveis ou 2 para serviços: \n");
    scanf("%d", &b);

    switch(b)
    {
      case 1:
          limpaTela();
        printf("Informe o modelo do carro que deseja buascar: \n");
        __fpurge(stdin);
        fgets(modeloBase,19,stdin);
        strtok(modeloBase, "\n");

        for(i = 0;i < quantCadAut;i++)
        {
            if(strcmp(carro[i].modelo,modeloBase))
            {
                printf("ID: %d\n", carro[i].id);
                printf("Modelo: %s\n", carro[i].modelo);
                printf("Ano: %s\n", carro[i].ano);
                printf("Marca: %s\n", carro[i].marca);
                printf("Valor: %.2f \n", carro[i].valor);
                printf("Tipo: %s\n",carro[i].tipo);
                printf("\n");
            }
        }
        puts("Pressione ENTER \n");
        getchar();
        break;
      case 2:
          limpaTela();
        printf("Informe a descrição do servico que deseja buascar: \n");
        __fpurge(stdin);
        fgets(servicoBase,19,stdin);
        strtok(servicoBase, "\n");

        for(i = 0;i < quantCadSer;i++)
        {
            if(strcmp(serv[i].descricao, servicoBase))
            {
                printf("Codigo: %d\n", serv[i].codigo);
                  printf("Descricao: %s\n", serv[i].descricao);
                  printf("Valor: %f \n", serv[i].valor);
                  printf("\n");
            }
        }
        puts("Tecle ENTER para voltar \n");
        getchar();
        break;
    }
}

void excluir()
{
    printf("Funcionalidade de exclusão.\n");
}

void limpaTela()
{
    system("clear");
}

